using System;
using System.Collections.Generic;
using ns26;
using ns27;
using Triton.Game.Mono;

namespace Triton.Game.Mapping
{
	[Attribute38("SpawnToDeckSpell")]
	public class SpawnToDeckSpell : SuperSpell
	{
		public enum HandActorSource
		{
			CHOSEN_TARGET,
			OVERRIDE,
			SPELL_TARGET
		}

		public enum SpreadType
		{
			STACK,
			SEQUENCE,
			CUSTOM_SPELL
		}

		[Attribute38("SpawnToDeckSpell.StackData")]
		public class StackData : MonoClass
		{
			public float m_RevealTime => method_2<float>("m_RevealTime");

			public float m_StaggerTime => method_2<float>("m_StaggerTime");

			public StackData(IntPtr address, string className)
				: base(address, className)
			{
			}

			public StackData(IntPtr address)
				: this(address, "StackData")
			{
			}
		}

		[Attribute38("SpawnToDeckSpell.SequenceData")]
		public class SequenceData : MonoClass
		{
			public float m_Spacing => method_2<float>("m_Spacing");

			public float m_RevealTime => method_2<float>("m_RevealTime");

			public float m_NextCardRevealTimeMin => method_2<float>("m_NextCardRevealTimeMin");

			public float m_NextCardRevealTimeMax => method_2<float>("m_NextCardRevealTimeMax");

			public float m_HoldTime => method_2<float>("m_HoldTime");

			public float m_NextCardHoldTime => method_2<float>("m_NextCardHoldTime");

			public SequenceData(IntPtr address, string className)
				: base(address, className)
			{
			}

			public SequenceData(IntPtr address)
				: this(address, "SequenceData")
			{
			}
		}

		public struct RevealSpellFinishedCallbackData
		{
			public Actor actor;

			public Card card;
		}

		public static float PHONE_HAND_OFFSET => MonoClass.smethod_6<float>(TritonHs.MainAssemblyPath, "", "SpawnToDeckSpell", "PHONE_HAND_OFFSET");

		public HandActorSource m_HandActorSource => method_2<HandActorSource>("m_HandActorSource");

		public string m_OverrideCardId => method_4("m_OverrideCardId");

		public float m_RevealStartScale => method_2<float>("m_RevealStartScale");

		public float m_RevealYOffsetMin => method_2<float>("m_RevealYOffsetMin");

		public float m_RevealYOffsetMax => method_2<float>("m_RevealYOffsetMax");

		public float m_RevealFriendlySideZOffset => method_2<float>("m_RevealFriendlySideZOffset");

		public float m_RevealOpponentSideZOffset => method_2<float>("m_RevealOpponentSideZOffset");

		public SpreadType m_SpreadType => method_2<SpreadType>("m_SpreadType");

		public StackData m_StackData => method_3<StackData>("m_StackData");

		public SequenceData m_SequenceData => method_3<SequenceData>("m_SequenceData");

		public Spell m_customRevealSpell => method_3<Spell>("m_customRevealSpell");

		public CardDef m_overrideCardDef => method_3<CardDef>("m_overrideCardDef");

		public SpawnToDeckSpell(IntPtr address, string className)
			: base(address, className)
		{
		}

		public SpawnToDeckSpell(IntPtr address)
			: this(address, "SpawnToDeckSpell")
		{
		}

		public new bool AddPowerTargets()
		{
			return method_11<bool>("AddPowerTargets", Array.Empty<object>());
		}

		public new Card GetTargetCardFromPowerTask(int index, PowerTask task)
		{
			return method_14<Card>("GetTargetCardFromPowerTask", new object[2] { index, task });
		}

		public new void OnAction(SpellStateType prevStateType)
		{
			method_8("OnAction", prevStateType);
		}

		public void OnRevealSpellFinished(Spell spell, object userData)
		{
			method_8("OnRevealSpellFinished", spell, userData);
		}

		public Vector3 ComputeRevealPosition(Vector3 offset)
		{
			return method_11<Vector3>("ComputeRevealPosition", new object[1] { offset });
		}

		public List<float> RandomizeRevealTimes(int count, float revealSec, float nextRevealSecMin, float nextRevealSecMax)
		{
			return method_14<Class270<float>>("RandomizeRevealTimes", new object[4] { count, revealSec, nextRevealSecMin, nextRevealSecMax })?.method_25();
		}

		public TAG_PREMIUM GetPremium(Entity entity)
		{
			return method_11<TAG_PREMIUM>("GetPremium", new object[1] { entity });
		}

		public EntityDef GetEntityDef(Entity entity)
		{
			return method_14<EntityDef>("GetEntityDef", new object[1] { entity });
		}

		public CardDef GetCardDef(Card card)
		{
			return method_14<CardDef>("GetCardDef", new object[1] { card });
		}
	}
}
